package com.site.util.base.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.site.util.base.po.BaseApplicationInfo;
import com.site.util.extremetable.QueryPage;


/**
 * 
 * 提供一些通用操作数据库方面
 */
public interface BaseDao {
	/**
	 * SQL方式,分页查询函数
	 * @param queryPage 分页对象封装了分页相关信息
	 * @param sql sql语句
	 * @param values sql查询参数
	 * @param asName 查询总数量SQL(替换from之前的Sql) 例如 select count(distinct rt) //rt主表别名
	 * @return
	 */
	public abstract List<Object[]> findBySQL(QueryPage queryPage, String sql, final Map<String, Object> values,String asName);
	/**
	 * SQL方式,分页查询数据
	 * @param  queryPage 分页属性对象，包装了分页相关信息
	 * @param  sql sql语句
	 * @param  values sql查询参数
	 * @param  mark      是否重复查询总记录数,如果数据不变建议用true这样提高性能,如果数据可变建议用false
	 * @return
	 */
	public abstract List<Object[]> findBySQL(QueryPage queryPage, String sql, final Map<String, Object> values,Boolean mark);
	/**
	 * SQL方式,分页查询函数
	 * @param queryPage 分页属性对象，包装了分页相关信息
	 * @param sql sql语句
	 * @param values sql查询参数
	 * @return
	 */
	public abstract List<Object[]> findBySQL(QueryPage queryPage, String sql, final Map<String, Object> values);
	/**
	 * SQL方式,查询所有记录
	 * @param sql    sql语句
	 * @param params 参数
	 * @return
	 */
	public abstract List<Object[]> findBySQL(final String sql, final Map<String, Object> params);
	/**
	 * 得到oracle日期sql条件格式
	 * @param date
	 * @return
	 */
	public abstract String oracleToDate(Date date);
	/**
	 * 得到oracle日期sql条件格式
	 * @param date
	 * @return
	 */
	public abstract String oracleToDate(String datestr);
	/**
	 * 恢复逻辑删除
	 * @param clazz    删除对象
	 * @param entityId id
	 */
	public abstract void markAsEnable(BaseApplicationInfo clazz, Serializable entityId);
	/**
	 * 逻辑删除
	 * @param clazz    删除对象
	 * @param entityId id
	 */
	public abstract void markAsDeleted(BaseApplicationInfo clazz, Serializable entityId);
	/**
	 * 获取数据库函数结果
	 * @param funcName 函数名：dbo.BuildBarcodeID()
	 * @return
	 */
	public abstract String getFunc(String funcName);
	/**
	 * 根据实体类，查询所有对象集合
	 * @param entity
	 * @return
	 */
	public abstract <T> List<T> findByClass(Class<T> entity);
	/**
	 * 根据hql查询总记录数
	 * @param hql HQL语句
	 * @return  总行数
	 */
	public abstract int getCountByHQL(String hql);
	/**
	 * SQL方式,查询总记录数,带参数
	 * @param sql sql语句
	 * @param params  参数
	 * @return        总行数
	 */
	public abstract int getCountBySQL(String sql, Map<String, Object> values);
	/**
	 * SQL方式,查询总记录数
	 * @param sql  SQL语句
	 * @return
	 */
	public abstract int getCountBySQL(String sql);
	
	/**
	 * SQL方式,根据实体查询数据
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public abstract <T> List<T> findIntoPOBySQL(String sql, Class<T> clazz);
	/**
	 * 根据SQL查询所有记录
	 * @param sql
	 * @return
	 */
	public abstract List<Object[]> findBySQL(String sql);
	/**
	 * 不删除order by的sql查询
	 * @param queryPage
	 * @param sql
	 * @return
	 */
	public abstract List<Object[]> findBySQLNotRemoveOrderBy(QueryPage queryPage, String sql);

	/**
	 * 分页查询函数，使用Sql.,count只查询一次
	 * @param queryPage 分页属性对象，包装了分页相关信息
	 * @param sql sql语句
	 * @return
	 */
	public abstract List<Object[]> findBySQL(QueryPage queryPage, String sql);
	/**
	 * 分页查询函数，使用Sql.
	 * @param queryPage 分页属性对象，包装了分页相关信息
	 * @param sql sql语句
	 * @param asName 查询总数量SQL(替换from之前的Sql) 例如 select count(distinct rt) //rt主表别名
	 * @return
	 */
	public abstract List<Object> findBySQL(QueryPage queryPage, String sql, String asName);
	/**
	 * 不删除order by的 hql查询
	 * @param queryPage 分页属性对象，包装了分页相关信息
	 * @param hql HQL语句
	 * @return
	 */
	public abstract <T> List<T> findByHQLNotRemoveOrderBy(QueryPage queryPage, String hql);
	/**
	 * 分页查询函数，使用hql.
	 * @param queryPage 分页属性对象，包装了分页相关信息
	 * @param hql HQL语句
	 * @param asName 查询总数量HQL(替换from之前的hql) 例如 select count(distinct rt) //rt主表别名
	 * @return
	 */
	public abstract <T> List<T> findByHQL(QueryPage queryPage, String hql, String asName);
	/**
	 * HQL查询,不分页
	 * @param hql HQL语句
	 * @param values HQL语句的参数，如果没有参数，传null即可
	 * @return
	 */
	public abstract <T> List<T> findByHQL(String hql, Map<String, Object> values);
	/**
	 * 分页查询数据,HQL方式
	 * @param queryPage 分页 
	 * @param hql       hql语句
	 * @param values    参数
	 * @param mark      是否重复查询总记录数,如果数据不变建议用true这样提高性能,如果数据可变建议用false
	 * @return
	 */
	public abstract <T> List<T> findByHQL(QueryPage queryPage, String hql, Map<String, Object> values,Boolean mark);
	/**
	 * 普通修改式
	 * @param entity
	 */
	public abstract void update(Object entity);
	/**
	 * 特殊修改,修改的时候要更新修改时间,修改人等
	 * @param entity
	 */
	public abstract void update(BaseApplicationInfo entity);
	/**
	 * 普通保存方式
	 * @param entity
	 */
	public abstract void save(Object entity);
	/**
	 * 特殊保存,保存的时候要保存创建时间,保存创建人等
	 * @param entity
	 */
	public abstract void save(BaseApplicationInfo entity);
	/**
	 * 根据id删除实体
	 * @param clazz   删除的实体
	 * @param id      
	 */
	public abstract <T> void delete(Class<T> clazz, Long id);
	/**
	 * 根据id获得所有对象,包括MARK_DELETE的
	 * @param clazz
	 * @param entityId
	 * @return
	 */
	public abstract <T> T getEntityById(Class<T> clazz, Serializable entityId);
	/**
	 * 根据id获得所有对象,不包括MARK_DELETE的
	 * @param clazz
	 * @param entityId
	 * @return
	 */
	public BaseApplicationInfo getNotMarkDeleteEntityById(Class<BaseApplicationInfo> clazz, Serializable entityId);
	/**
	 * SQL方式，执行删除，更新，并返回受影响行数
	 * @param sql
	 * @return
	 */
	public abstract Integer executeBySQL(String sql);
	
	/**
	 * 根据对象，前缀，生产位数，产生no
	 * @param prefix   前缀
	 * @param count    位数
	 * @param cls      对象   
	 * @return
	 */
	public abstract <T> String getMaxId(String prefix,Integer count,Class<T> cls);
}
